package ar.edu.sovietrussia;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

import persistenciatest.SessionManager;


public class PartidoHome {
	
	private boolean cacheable = true;
	
	//-------------------------------------------------------------------------//
	
	public void storePartido(Partido partido){
		Session session = SessionManager.getInstance().getSession();
		session.save(partido);
	}
	public void update(Partido partido){
		Session session = SessionManager.getInstance().getSession();
		session.update(partido);
	}
	public List<Partido> findAll(){
		Session session = SessionManager.getInstance().getSession();
		 Criteria criteria = session.createCriteria(Partido.class);
		criteria.setCacheable(cacheable);
		return criteria.list();
	}
	
	//-------------------------------------------------------------------------//
	
	public List<PartidoSimple> getPartidosSimplesOfEquiposUsingCriteria(Equipo equipo1, Equipo equipo2){
		Session session = SessionManager.getInstance().getSession();
		Criteria query = session.createCriteria(PartidoSimple.class);
		
		
		Criterion first = Restrictions.and(Restrictions.eq("local", equipo1), Restrictions.eq("visitante", equipo2));
		Criterion second = Restrictions.and(Restrictions.eq("local", equipo2), Restrictions.eq("visitante", equipo1));
		Criterion main = Restrictions.or(first, second);
		
		query.add(main);
		query.setCacheable(cacheable);
		
		return query.list();
	}
	
	//-------------------------------------------------------------------------//
	
	public List<PartidoSimple> getPartidosSimplesOfEquiposUsingHQL(Equipo equipo1, Equipo equipo2){
		Session session = SessionManager.getInstance().getSession();
		Query hql = session.createQuery(" from PartidoSimple as ps" +
										" where (ps.local = :equipo1 and ps.visitante = :equipo2)" +
										" or (ps.local = :equipo2 and ps.visitante = :equipo1)");
		hql.setParameter("equipo1", equipo1);
		hql.setParameter("equipo2", equipo2);
		hql.setCacheable(cacheable);
		return hql.list();
		
	}
	
	//-------------------------------------------------------------------------//
	

	public long totalPartidosJugados(Equipo equipo){
		Session session = SessionManager.getInstance().getSession();
		Query query = session.createQuery(
				"select count(*) " +
				"from Partido as p " +
				"where p.local = :equipoparam or p.visitante = :equipoparam" 
				);
		query.setParameter("equipoparam", equipo);
		query.setCacheable(cacheable);
		return  (Long) query.uniqueResult();
	}

	public List<Equipo> getGanadoresFromPartidosBetween(Equipo equipo1,Equipo equipo2){
		Session session = SessionManager.getInstance().getSession();
		Query query = session.createQuery(
				"select  ganador " +
				"from Partido as ps " +
				" where (ps.local = :equipo1 and ps.visitante = :equipo2)" +
				" or (ps.local = :equipo2 and ps.visitante = :equipo1)");
		query.setParameter("equipo1", equipo1);
		query.setParameter("equipo2", equipo2);

		query.setCacheable(cacheable);
		return query.list();
	}
	
	
	
	public List<Equipo> ganadorPorPartidoDeCopa(){
		Session session = SessionManager.getInstance().getSession();
		Query query = session.createQuery(
				"select  p.ganador " +
				"from PartidoDeCopa as p"
				);
		query.setCacheable(cacheable);
		return  query.list();
	}
	
}
